﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Data;
using System.Reflection;
using System.Collections;

namespace Siav
{
    class Utilidades
    {

        private string _justificativa;
        /// <summary>
        /// Metodo para enviar uma mensagem de confirmação
        /// </summary>
        /// <param name="Mensagem"></param>
        /// <returns></returns>
        public static bool Confirmacao(string Mensagem)
        {
            if (MessageBox.Show(Mensagem, "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// Método para o botão de Sair...
        /// </summary>
        /// <returns></returns>
        public static bool Sair()
        {

            if (Confirmacao("Tem certeza que deseja sair dessa tela?") == true)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public static bool Excluir()
        {

            if (Confirmacao("Tem certeza que deseja excluir esse registro?") == true)
            {
                return true;
            }
            else
            {
                return false;
            }

        }





        /// <summary>
        /// Verifica se um e-mail é válido
        /// <summary>
        public static bool ValidaEmail(string str)
        {
            if (!string.IsNullOrEmpty(str))
            {
                Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
                return regex.IsMatch(str);
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Apaga todos os textboxes de uma página, recursivamente
        /// <summary>
        public static void LimpaCampos(Control.ControlCollection controles)
        {
            foreach (Control ctrl in controles)
            {
                if (ctrl is TextBox)
                {
                    ((TextBox)(ctrl)).Clear();
                }
                //if (ctrl is ComboBox)
                //{
                //    ((ComboBox)(ctrl)).SelectedIndex = -1;
                //}
                LimpaCampos(ctrl.Controls);
            }
        }
        /// <summary>
        /// Função para tirar formatação de uma string como ".,/)(-" ""
        /// </summary>
        /// <param name="texto">Palavra ou Campo a ser "Limpo"</param>
        /// <returns></returns>
        public static string removeFormatacao(string texto)
        {
            string txt = "";

            txt = texto.Replace(".", "");
            txt = txt.Replace("-", "");
            txt = txt.Replace(",", "");
            txt = txt.Replace("/", "");
            txt = txt.Replace("(", "");
            txt = txt.Replace(")", "");
            txt = txt.Replace(" ", "");

            return txt;
        }
        /// <summary>
        /// Função para tirar acento das palavras
        /// </summary>
        /// <param name="palavra">Palavra ou Campo a ser "Limpo"</param>
        /// <returns></returns>
        public static string TirarAcento(string palavra)
        {
            string palavraSemAcento = "";
            string caracterComAcento = "áàãâäéèêëíìîïóòõôöúùûüçÁÀÃÂÄÉÈÊËÍÌÎÏÓÒÕÖÔÚÙÛÜÇ";
            string caracterSemAcento = "aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC";

            for (int i = 0; i < palavra.Length; i++)
            {
                if (caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1))) >= 0)
                {
                    int car = caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1)));
                    palavraSemAcento += caracterSemAcento.Substring(car, 1);
                }
                else
                {
                    palavraSemAcento += palavra.Substring(i, 1);
                }
            }

            return palavraSemAcento;
        }
        /// <summary>
        /// Função para tirar os acentos de uma string e também remover a formatação
        /// </summary>
        /// <param name="texto"></param>
        /// <returns></returns>
        public static string VarreString(string texto)
        {
            string textolimpo = removeFormatacao(texto);
            string textoFinal = TirarAcento(textolimpo);
            return textoFinal;
        }
        /// <summary>
        /// Metodo para enviar uma mensagem de aviso
        /// </summary>
        /// <param name="Mensagem">Mensagem de informação a ser enviada</param>
        /// <returns></returns>
        public static void Informacao(string Mensagem)
        {
            MessageBox.Show(Mensagem, "Informação", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        /// <summary>
        /// Metodo para enviar uma mensagem de Erro
        /// </summary>
        /// <param name="Mensagem">Mensagem de erro a ser enviada</param>
        /// <returns></returns>
        public static void Erro(string Mensagem)
        {
            MessageBox.Show(Mensagem, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        [DllImport("DllInscE32.DLL")]
        public static extern int ConsisteInscricaoEstadual(string sIE, string sUF);
        /// <summary>
        /// Função para validação de Inscrição Estadual, necessario usar "DLLInscE32.DLL"
        /// </summary>
        /// <param name="sIE"> Numero da Inscrição Estadual</param>
        /// <param name="sUF">Sigla da Unidade da Federação</param>
        /// <param name="sCampo">Nome do Campo que contem o número</param>
        public void ValidaIE(string sIE, string sUF, TextBox sCampo)
        {
            if (ConsisteInscricaoEstadual(sIE, sUF) != 0)
            {
                sCampo.BackColor = Color.Red;
                sCampo.ForeColor = Color.White;
                sCampo.Focus();
                Erro("I.E. Inválida, confira os numeros e tente novamente!");

            }
            else
            {
                sCampo.BackColor = Color.White;
                sCampo.ForeColor = Color.Black;
            }
        }

        private bool testaCPF(string vrCPF)
        {
            string valor = vrCPF.Replace(".", "");
            valor = valor.Replace("-", "");

            if (valor.Length != 11)
                return false;

            bool igual = true;
            for (int i = 1; i < 11 && igual; i++)
                if (valor[i] != valor[0])
                    igual = false;

            if (igual || valor == "12345678909")
                return false;

            int[] numeros = new int[11];

            for (int i = 0; i < 11; i++)
                numeros[i] = int.Parse(
                  valor[i].ToString());

            int soma = 0;
            for (int i = 0; i < 9; i++)
                soma += (10 - i) * numeros[i];

            int resultado = soma % 11;

            if (resultado == 1 || resultado == 0)
            {
                if (numeros[9] != 0)
                    return false;
            }
            else if (numeros[9] != 11 - resultado)
                return false;

            soma = 0;
            for (int i = 0; i < 10; i++)
                soma += (11 - i) * numeros[i];

            resultado = soma % 11;

            if (resultado == 1 || resultado == 0)
            {
                if (numeros[10] != 0)
                    return false;
            }
            else
                if (numeros[10] != 11 - resultado)
                    return false;

            return true;
        }

        private static bool testaCNPJ(string vrCNPJ)
        {
            string CNPJ = vrCNPJ.Replace(".", "");
            CNPJ = CNPJ.Replace("/", "");
            CNPJ = CNPJ.Replace("-", "");
            CNPJ = CNPJ.Replace(",", "");

            int[] digitos, soma, resultado;
            int nrDig;
            string ftmt;
            bool[] CNPJOk;

            ftmt = "6543298765432";
            digitos = new int[14];
            soma = new int[2];
            soma[0] = 0;
            soma[1] = 0;
            resultado = new int[2];
            resultado[0] = 0;
            resultado[1] = 0;
            CNPJOk = new bool[2];
            CNPJOk[0] = false;
            CNPJOk[1] = false;

            try
            {
                for (nrDig = 0; nrDig < 14; nrDig++)
                {
                    digitos[nrDig] = int.Parse(
                        CNPJ.Substring(nrDig, 1));
                    if (nrDig <= 11)
                        soma[0] += (digitos[nrDig] *
                          int.Parse(ftmt.Substring(
                          nrDig + 1, 1)));
                    if (nrDig <= 12)
                        soma[1] += (digitos[nrDig] *
                          int.Parse(ftmt.Substring(
                          nrDig, 1)));
                }

                for (nrDig = 0; nrDig < 2; nrDig++)
                {
                    resultado[nrDig] = (soma[nrDig] % 11);
                    if ((resultado[nrDig] == 0) || (
                         resultado[nrDig] == 1))
                        CNPJOk[nrDig] = (
                        digitos[12 + nrDig] == 0);
                    else
                        CNPJOk[nrDig] = (
                        digitos[12 + nrDig] == (
                        11 - resultado[nrDig]));
                }
                return (CNPJOk[0] && CNPJOk[1]);
            }
            catch
            {
                return false;
            }
        }
        /// <summary>
        /// Validação de campos de CNPJ e digito verificador
        /// </summary>
        /// <param name="vCNPJ">String com os numeros do documento</param>
        /// <param name="sCampo">Nome do campo do tipo "MaskedTextBox" para validação</param>
        public void ValidaCNPJ(string vCNPJ, MaskedTextBox sCampo)
        {
            if (testaCNPJ(vCNPJ) == false)
            {
                sCampo.BackColor = Color.Red;
                sCampo.ForeColor = Color.White;
                sCampo.Focus();
                Erro("CNPJ inválido, confira os números e tente novamente!");
            }
            else
            {
                sCampo.BackColor = Color.White;
                sCampo.ForeColor = Color.Black;
            }
        }

        /// <summary>
        /// Validação de campos de CNPJ e digito verificador em campos textbox
        /// </summary>
        /// <param name="vCNPJ">String com os numeros do documento</param>
        /// <param name="sCampo">Nome do campo do tipo "TextBox" para validação</param>
        public void ValidaCNPJSM(string vCNPJ, TextBox sCampo)
        {
            if (testaCNPJ(vCNPJ) == false)
            {
                sCampo.BackColor = Color.Red;
                sCampo.ForeColor = Color.White;
                sCampo.Focus();
                Erro("CNPJ inválido, confira os números e tente novamente!");
            }
            else
            {
                sCampo.BackColor = Color.White;
                sCampo.ForeColor = Color.Black;
            }
        }




        /// <summary>
        /// Validação de campos de CPF e digito verificador
        /// </summary>
        /// <param name="vCNPJ">String com os numeros do documento</param>
        /// <param name="sCampo">Nome do campo do tipo "MaskedTextBox" para validação</param>
        public void ValidaCPF(string vCPF, MaskedTextBox sCampo)
        {
            if (testaCPF(vCPF) == false)
            {
                sCampo.BackColor = Color.Red;
                sCampo.ForeColor = Color.White;
                sCampo.Focus();
                Erro("CPF inválido, confira os números e tente novamente!");
            }
            else
            {
                sCampo.BackColor = Color.White;
                sCampo.ForeColor = Color.Black;
            }
        }

        /// <summary>
        /// Validação de campos de CPF e digito verificador em campos textbox
        /// </summary>
        /// <param name="vCNPJ">String com os numeros do documento</param>
        /// <param name="sCampo">Nome do campo do tipo "TextBox" para validação</param>
        public void ValidaCPFSM(string vCPF, TextBox sCampo)
        {
            if (testaCPF(vCPF) == false)
            {
                sCampo.BackColor = Color.Red;
                sCampo.ForeColor = Color.White;
                sCampo.Focus();
                Erro("CPF inválido, confira os números e tente novamente!");
            }
            else
            {
                sCampo.BackColor = Color.White;
                sCampo.ForeColor = Color.Black;
            }
        }

        private static string m_NumeroPedido;
        public static string NumeroPedido
        {
            get { return m_NumeroPedido; }
            set { m_NumeroPedido = value; }
        }

        private static int m_Usuario;
        public static int Usuario
        {
            get { return m_Usuario; }
            set { m_Usuario = value; }
        }

        private static int m_ItemQtd;
        public static int ItemQtd
        {
            get { return m_ItemQtd; }
            set { m_ItemQtd = value; }
        }

        public static void InserirProdutosNoPedido(string vNumeroPedido, int vCodigoProduto, int vQuantidade, decimal vDesconto)
        {
            try
            {
                var NumeroPedido = int.Parse(vNumeroPedido);
                using (SiavEntities Entidades = new SiavEntities())
                {
                    var Produto = Entidades.Produtos2.Where(Prod => Prod.CodigoProduto == vCodigoProduto).FirstOrDefault();

                    PedidoDetalhes2 Det = new PedidoDetalhes2();
                    Det.CodigoPedido = NumeroPedido;
                    Det.CodigoProduto = vCodigoProduto;
                    Det.Quantidade = vQuantidade;
                    Det.ValorUnitario = decimal.Parse(Produto.Valor.ToString());
                    Det.Desconto = vDesconto;

                    Entidades.AddObject("PedidoDetalhes2", Det);
                    Entidades.SaveChanges();
                    Informacao("Produto inserido com sucesso");
                }
            }
            catch
            {
                Erro("Erro ao inserir o produto no pedido");
            }
        }

        public static void SoNumeros(KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }

        private static decimal m_ValorItem;
        public static decimal ValorItemDesconto
        {
            get { return m_ValorItem; }
            set { m_ValorItem = value; }
        }

        private static string vJustificativa;
        public static string Justificativa
        {
            get { return vJustificativa; }
            set { vJustificativa = value; }
        }

        private static int vNumeroConta;
        public static int NumeroConta
        {
            get { return vNumeroConta; }
            set { vNumeroConta = value; }
        }
        //private static int m_ValorItem;
        //public static int ValorItem
        //{
        //    get { return m_ValorItem; }
        //    set { m_ValorItem = value; }
        //}
        public static string limitarTexto(string texto, int quantidade)
        {

            string strRetorno;

            texto = texto.Trim();

            if (texto.Length <= quantidade)
                strRetorno = texto;
            else
                strRetorno = null;

            if (texto.Substring(0, texto.Length).Trim().IndexOf(" ") > 0)
            {
                if (texto.Length >= quantidade + 1)
                {
                    if (texto.Substring(0, quantidade + 1).Trim() != " ")
                    {
                        int posicaoEspaco = texto.Substring(0, quantidade - 1).Trim().LastIndexOf(" ");
                        if (posicaoEspaco > 0)
                        {
                            strRetorno = texto.Substring(0, posicaoEspaco).Trim();
                        }
                        else
                        {
                            int posicaoEspacoPalavra = texto.Substring(0, texto.Length).Trim().IndexOf(" ");
                            if (posicaoEspaco < texto.Substring(0, posicaoEspacoPalavra).Trim().IndexOf(" "))
                            {
                                strRetorno = texto.Substring(0, quantidade).Trim();
                            }
                            else
                            {
                                strRetorno = texto.Substring(0, posicaoEspacoPalavra).Trim();
                            }
                        }
                    }
                }
            }

            return strRetorno;
        }

        public static int CodigoCliente { get; set; }

        public static string NFETextoObs { get; set; }

        public static DataTable RetornarDataTable(IQueryable pObjQuery)
        {
            DataTable _dt = new DataTable();

            //Cria o DataTable
            foreach (var item in pObjQuery)
            {
                Type t = item.GetType();
                PropertyInfo[] properties = t.GetProperties();
                for (int i = 0; i < properties.Length; i++)
                {
                    _dt.Columns.Add(properties[i].Name);
                }
                break;
            }

            IEnumerator en = (IEnumerator)pObjQuery.GetEnumerator();

            //Popula o DataTable
            while (en.MoveNext())
            {
                Type ten = en.Current.GetType();
                PropertyInfo[] propertiesen = ten.GetProperties();
                DataRow _dtrow = _dt.NewRow();
                for (int i = 0; i < propertiesen.Length; i++)
                {
                    object obj = propertiesen[i].GetValue(en.Current, new object[] { });
                    _dtrow[i] = obj;
                }
                _dt.Rows.Add(_dtrow);
            }

            return _dt;
        }
    }
}

